package org.example.classtopia.Controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.example.classtopia.Common.Result.Result;
import org.example.classtopia.Model.Entity.UserMessage;
import org.example.classtopia.Service.Impl.UserMessageService;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@Tag(name = "用户消息管理", description = "用户消息管理接口")
@RestController
@RequestMapping("/messages")
public class MessageController {

    private final UserMessageService userMessageService;

    public MessageController(UserMessageService userMessageService) {
        this.userMessageService = userMessageService;
    }

    /**
     * 根据用户ID、消息状态和消息类型获取用户消息列表
     * @param userId 用户ID
     * @param page 页码，从0开始，默认为0
     * @param size 每页大小，默认为10
     * @param type 消息状态类型：0-查看未读消息，1-查看已读消息，-1-查看全部消息，默认为-1
     * @param messageType 消息类型：0-系统消息，1-点赞和评论消息
     * @return 分页的用户消息列表
     */
    @Operation(summary = "获取用户消息列表", description = "根据用户ID、消息状态和消息类型获取分页的用户消息列表")
    @GetMapping("/user/{userId}")
    public Page<UserMessage> getMessageByUser(
            @Parameter(description = "用户ID", required = true) @PathVariable Long userId,
            @Parameter(description = "页码，从0开始") @RequestParam(defaultValue = "0") int page,
            @Parameter(description = "每页大小") @RequestParam(defaultValue = "10") int size,
            @Parameter(description = "消息状态类型：0-未读消息，1-已读消息，-1-全部消息") @RequestParam(defaultValue = "-1") int type,
            @Parameter(description = "消息类型：0-系统消息，1-点赞和评论消息", required = true) @RequestParam int messageType
    ){
        return userMessageService.getUserMessageByUserId(userId, page, size, type, messageType);
    }

    /**
     * 更新用户消息状态为已读
     * @param Id 消息ID
     * @return 操作结果
     */
    @Operation(summary = "更新消息状态", description = "将指定消息标记为已读状态")
    @PostMapping("/updateStatus")
    public Result<String> updateUserMessageStatus(
            @Parameter(description = "消息ID", required = true) @RequestParam Long Id
    ){
        return userMessageService.updateUserMessageStatus(Id);
    }

    /**
     * 将用户全部未读消息设为已读
     * @param userId 用户ID
     * @return 操作结果
     */
    @Operation(summary = "全部设为已读", description = "将指定用户的全部未读消息设为已读")
    @PostMapping("/markAllRead")
    public Result<String> markAllMessagesAsRead(
            @Parameter(description = "用户ID", required = true) @RequestParam Long userId
    ){
        return userMessageService.markAllMessagesAsRead(userId);
    }

    /**
     * 判断用户是否有未读消息（可按消息类型筛选）
     * @param userId 用户ID
     * @param messageType 消息类型：-1-全部，0-系统消息，1-点赞评论
     * @return 是否有未读消息（true/false）
     */
    @Operation(summary = "判断用户是否有未读消息", description = "根据用户ID和消息类型判断是否存在未读消息")
    @GetMapping("/user/{userId}/hasUnread")
    public Result<Boolean> hasUnreadMessages(
            @Parameter(description = "用户ID", required = true) @PathVariable Long userId,
            @Parameter(description = "消息类型：-1-全部，0-系统消息，1-点赞评论", required = false)
            @RequestParam(defaultValue = "-1") int messageType
    ){
        return userMessageService.hasUnreadMessages(userId, messageType);
    }

    /**
     * 统计三种类型的未读消息数量
     * @param userId 用户ID
     * @return 各类型未读消息数量（postLike/comment/system）
     */
    @Operation(summary = "统计三种类型的未读消息数量", description = "根据用户ID统计点赞、评论、系统三类未读消息数量")
    @GetMapping("/user/unreadCount")
    public Result<Map<String, Integer>> getUnreadMessageCountByType(
            @Parameter(description = "用户ID", required = true) @RequestParam Long userId
    ){
        return userMessageService.getUnreadMessageCountByType(userId);
    }
}
